// index.js 模拟数据的导入导出，路由批量注册，以及公用逻辑实现，同时兼容了Mock和中间件的使用
const Mock = require('mockjs')
const { param2Obj } = require('./utils') // 返回请求的对象

const login = require('./login')
const user = require('./user')
const table = require('./table')
const datav = require('./datav')
const scene = require('./scene')
const room = require('./room')
const role = require('./role')
const profession = require('./profession')
const permission = require('./permission')
const permission_group = require('./permission-group')
const pay = require('./pay')
const log = require('./log')
const finance = require('./finance')
const file = require('./file')
const dormitory = require('./dormitory')
const communicate = require('./communicate')
const code = require('./code')
const classroom = require('./classroom')
const academy = require('./academy')

const mocks = [
  ...login,
  ...user,
  ...table,
  ...datav,
  ...scene,
  ...room,
  ...role,
  ...profession,
  ...permission,
  ...permission_group,
  ...pay,
  ...log,
  ...finance,
  ...file,
  ...dormitory,
  ...communicate,
  ...code,
  ...classroom,
  ...academy
]

// 这段代码是一个使用Mock进行XHR（XMLHttpRequest）请求拦截和响应模拟的封装函数。主要包含以下几个部分：
// 1.Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send: 在Mock的XHR原型上对send方法进行了拦截，并将原本的send方法保存在proxy_send中。
// 2.Mock.XHR.prototype.send = function () { ... }: 对send方法进行了重写，使其可以通过this.custom.xhr获取到真正的xhr对象，从而设置withCredentials和responseType等属性。
// for front mock
// please use it cautiously, it will redefine XMLHttpRequest, 请谨慎使用，它将重新定义XMLHttpRequest
// which will cause many of your third-party libraries to be invalidated(like progress event). 这将导致您的许多第三方库无效（如进度事件）。
// 重新定义XMLHttpRequest，针对Mock
/* 这段代码的作用是使用Mock.js模拟XMLHttpRequest(XHR)对象的send()方法，以拦截Ajax请求，将请求发送至Mock.js进行处理，并返回模拟数据。
具体来说，这段代码重写了Mock.XHR原型上的send()方法，将原有的send()方法保存成proxy_send属性。在拦截请求时，如果当前XHR对象所携带的自定义属性中有xhr，则将这个自定义属性中的xhr对象与当前XHR对象的withCredentials和responseType属性相匹配。然后，通过调用proxy_send()方法来发送请求，并交由Mock.js进行处理。从而可以在测试中模拟各种请求，确保测试的完整性。
需要注意的是，这段代码只是对XMLHttpRequest对象进行了拦截，对于使用Fetch API、WebSocket等其他网络请求技术的应用，需要编写相应的mock规则实现拦截和模拟数据的返回。 */
function mockXHR() {
  // mock patch 模拟修补程序
  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
  Mock.XHR.prototype.send = function () {
    if (this.custom.xhr) {
      this.custom.xhr.withCredentials = this.withCredentials || false

      if (this.responseType) {
        this.custom.xhr.responseType = this.responseType
      }
    }
    this.proxy_send(...arguments)
  }

// 3.function XHR2ExpressReqWrap(respond) { ... }: 将传入的respond回调封装为一个新的函数，并返回一个新的函数。
// 这个函数接收options参数，根据传入的respond回调和options参数生成Mock数据，并用Mock.mock()方法对生成的数据进行处理和格式化。
  function XHR2ExpressReqWrap(respond) {
    return function (options) {
      let result = null
      if (respond instanceof Function) {
        const { body, type, url } = options
        result = respond({
          method: type,
          body: JSON.parse(body),
          query: param2Obj(url)
        })
      } else {
        result = respond
      }
      return Mock.mock(result)
    }
  }

// for (const i of mocks) { ... }: 通过遍历mocks数组来进行请求拦截和响应模拟。使用new RegExp()对url参数进行正则匹配，如果匹配成功则调用XHR2ExpressReqWrap方法对响应进行处理，并使用Mock.mock()方法对响应数据进行处理和格式化。
// 遍历mocks去拦截请求 默认是get请求
  for (const i of mocks) {
    Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
  }
}

module.exports = {
  mocks,
  mockXHR
}

